/*
 * Repraesentiert einen Staat mit x Personen  
 */
public class Staat 
{
	//Staat Name 
	private final String name;
	
	//Anfang der Liste
	private element head;
	
	//Ende der Liste
	private element tail;
	
	//Anzahl aller erzeugten elemente
	private int n;
	
	/*Beim erzeugen einer neuen Liste 
	head = null
	Anzahl der Elemente = 0*/
	
	public Staat(String name)
	{
		this.name = name;
		this.head = null;
		this.tail = null;
		this.n = 0;
	}
	//Gibt Name des Staates zurueck
	//Out: String 
	public String getname()
	{
		return this.name;
	}
	//Repraesentiert ein Element
	public class element
	{
		//Represent the value of element
		private Person valueelem; 
		
		//Represent next element
		private element nextelem;
		
		//Create the element,set next element = null
		//IN: Person
		public element (Person elem) 
		{ 
			this.valueelem = elem; 
			this.nextelem = null;
		}
			
		//---Getter---
		// get next element
		// Out: element of List
		protected element getnext()
		{
			return this.nextelem;
		}
		//get Value of element
		// Out: Person
		protected Person getvalue()
		{
			return this.valueelem;
				
		}		
		//---Setter:
		//set next element
		// IN: element
		public void setnext(element a)
		{
			this.nextelem = a;
		}
		//set Value of element
		// IN: Person
		public void setvalue(Person a)
		{
			this.valueelem = a;
		}		
	}
	//Check if Vorn + Nachn exists in List
	protected boolean checkdouble(String Vorn,String Nachn)
	{
		iterator temp_iterator = new iterator();
		while(temp_iterator.hasNext())
		{
			if(temp_iterator.pointer.getvalue().getNachname().equals(Nachn) && temp_iterator.pointer.getvalue().getVorname().equals(Vorn))
				return false;
			
			temp_iterator.next();	
		}
		return true;
	}
	//Einfuegen eines neuen Elements am Ende der Liste
	//IN: Person
	//Out: boolean (add or add not)
	public boolean add(Person newelem)
	{
		if(!checkdouble(newelem.getVorname(),newelem.getNachname()))
				return false;
		//Anzahl erhoehen
		this.n++;
		
		if (head == null)
			tail = head = new element(newelem);
		else 
		{
			element neu = new element(newelem);
			tail.setnext(neu);
			tail = neu; 
		}
			return true;
	}
	//Create the element,set next element = null
	//IN: m Person never Student
	public boolean add(String geschlecht, String Vorn,String Nachn,int jahr,boolean param1,String param2)
	{
		if(!checkdouble(Vorn,Nachn))
			return false;
		//Anzahl erhoehen
		this.n++;
		
		if (head == null)
			tail = head = new element(new Person(geschlecht,Vorn,Nachn,jahr,param1,param2));
		else
		{
			element neu = new element(new Person(geschlecht,Vorn,Nachn,jahr,param1,param2));
			tail.setnext(neu);
			tail = neu; 
		}
		return true;
	}
	//Create the element,set next element = null
	//IN: w Person never Student
	public boolean add(String geschlecht, String Vorn,String Nachn,int jahr,boolean param1,String param2,int Anfang,int Ende,int Note)
	{
		if(!checkdouble(Vorn,Nachn))
			return false;
		
		//Anzahl erhoehen
		this.n++;
		
		if (head == null)
			tail = head = new element(new Student(geschlecht,Vorn,Nachn,jahr,param1,param2,Anfang,Ende,Note));
		else
		{
			element neu = new element(new Student(geschlecht,Vorn,Nachn,jahr,param1,param2,Anfang,Ende,Note));
			tail.setnext(neu);
			tail = neu; 
		}	
		return true;
	}
	//delete elements from List
	public boolean remove(String Vorn,String Nachn)
	{
		iterator temp_iterator = new iterator();
		iterator pre = new iterator();
		while(temp_iterator.hasNext())
		{
			if(temp_iterator.pointer.getvalue().getNachname().equals(Nachn) && temp_iterator.pointer.getvalue().getVorname().equals(Vorn))
			{
				pre.pointer.setnext(temp_iterator.pointer.nextelem);
				return true;
			}
			pre.pointer = temp_iterator.pointer;
			temp_iterator.next();	
			
		}
		return false;
	}
	//Suchen nach Personen in einem Staat ueber deren Namen 
	//IN:String ,String
	//Out: boolean (gefunden)
	public boolean searchperson(String Vorn,String Nachn)
	{
		iterator temp_iterator = new iterator();
		while(temp_iterator.hasNext())
		{
			if(temp_iterator.pointer.getvalue().getNachname().equals(Nachn) && temp_iterator.pointer.getvalue().getVorname().equals(Vorn))
				return true; //gefunden
			temp_iterator.next();
		}
		return false;
	}
	//Rep. Pointer auf Elemente der Liste
	//Intit auf Head
	protected class iterator
	{
		private element pointer;
			
		//Pointer auf erstes Element in der Liste setzen
		iterator()
		{
			pointer = head;
		}
		
		//Gibt das naechste Element zurueck und verschiebt Pointer auf dieses
		//Out: aktuelles element Person ||null wenn liste leer
		public Person next() 
		{
			if(pointer == null)
				return null;
			else
			{
				Person elem = pointer.getvalue();
				pointer = pointer.getnext();
				return elem;
			}
		}
		//Gibt zurueck ob ein naechstes Element exestiert
		//Out: boolean
		public boolean hasNext() 
		{
			return pointer != null;
		}
			
	}
	//Erzeugt einen iterator der Liste
	//Out: class iterator();
	public iterator iterator() 
	{
		return new iterator();
	}
	//Augabe der Werte
	/*
	 * Gibt alle Werte in einem String zurueck
	 * OUT: String
	 */
	public String toString()
	{
		String out ="";
		
		iterator temp_iterator = iterator();
		while(temp_iterator.hasNext())
		{
			out = out + temp_iterator.next().toString();
		}
		return out;
	}
	//Akademikerquote fuer Frauen, Maenner, sowie Frauen und Maenner gemeinsam 
	//wobei die Akademikerquote der Prozentsatz der Personen ueber 30 Jahren ist, die ein Studium abgeschlossen haben)
	//OUT: Int (%)
	public double akademikerquote(int type) //0 fuer Frauen, 1 fuer Maenner, 2 fuer Beide
	{
		iterator temp_iterator = iterator();
		
		int sum = 0; //Anzahl der Personen gesamt
		int x = 0; //Anzahl der Personen mit Abschluss
		
		if (type == 0) //Frauen 
		{
			while(temp_iterator.hasNext())
			{
				if(temp_iterator.pointer.getvalue().getGeschlecht().equals("w")) //Alle Frauen suchen
				{
					sum++;
					if(temp_iterator.pointer.getvalue() instanceof Student)
						if(((Student)temp_iterator.pointer.getvalue()).isExStudent() && temp_iterator.pointer.getvalue().getGeburtsjahr() >= 30) //Alle Frauen mit Abschluss suchen
						{
							x++;
						}
				}
				temp_iterator.next();
			}			
			if( sum != 0) {return (100/(double)sum) * (double)x; }
			
		}
			
		if (type == 1) //Maenner
		{
			while(temp_iterator.hasNext())
			{
				if(temp_iterator.pointer.getvalue().getGeschlecht().equals("m")) //Alle Maenner suchen
				{
					sum++;
					if(temp_iterator.pointer.getvalue() instanceof Student)
						if(((Student)temp_iterator.pointer.getvalue()).isExStudent() && temp_iterator.pointer.getvalue().getGeburtsjahr() >= 30) //Alle Frauen mit Abschluss suchen
						{
							x++;
						}
				}
				temp_iterator.next();
			}
			if( sum != 0) {return (100/(double)sum) * (double)x; }
			
		}
		if (type == 2) //Beide
		{
			while(temp_iterator.hasNext()) //Alle personen durchgehen
			{
				if(temp_iterator.pointer.getvalue() instanceof Student)	
					if(((Student)temp_iterator.pointer.getvalue()).isExStudent() && temp_iterator.pointer.getvalue().getGeburtsjahr() >= 30) //Alle Frauen mit Abschluss suchen
					{
						x++;
					}
			
			temp_iterator.next();
			}
			
			if( n != 0) {return (100/(double)n) * (double)x; }
		}
		return 0;
	}
	//durchschnittliche Studiendauer in Jahren fuer Frauen, Maenner, sowie Frauen und Maenner gemeinsam
	//OUT: Int (Jahre)
	public double studiendauerDurchschnitt(int type) //0 fuer Frauen, 1 fuer Maenner, 2 fer Beide
	{
		
		iterator temp_iterator = iterator();
		
		int sum = 0; //Summe alle Studiendauern der Personen
		int x = 0; //Anzahl der Personen mit Abschluss
		
		if (type == 0) //Frauen 
		{
			while(temp_iterator.hasNext())
			{
				if(temp_iterator.pointer.getvalue() instanceof Student)
					if(temp_iterator.pointer.getvalue().getGeschlecht().equals("w")) //Alle Frauen suchen mit Abschluss suchen
					{
						sum = sum + ((Student)temp_iterator.pointer.getvalue()).getStudienDauer();
						x++;
					}
				temp_iterator.next();
			}
			if (x != 0)
				return (double)sum / (double)x;
		}
		if (type == 1) //Maenner
		{
			while(temp_iterator.hasNext())
			{
				if(temp_iterator.pointer.getvalue() instanceof Student)
					if(temp_iterator.pointer.getvalue().getGeschlecht().equals("m") && ((Student)temp_iterator.pointer.getvalue()).isExStudent()) //Alle Maenner mit Abschluss suchen suchen
					{
						sum = sum + ((Student)temp_iterator.pointer.getvalue()).getStudienDauer();
						x++;
					}
				temp_iterator.next();
			}
			if (x != 0)
				return (double)sum / (double)x;
		}
		if (type == 2) //Beide
		{
			while(temp_iterator.hasNext())
			{
				if(temp_iterator.pointer.getvalue() instanceof Student)
					if(((Student)temp_iterator.pointer.getvalue()).isExStudent()) //Alle Personen mit Abschluss suchen
					{
						sum = sum + ((Student)temp_iterator.pointer.getvalue()).getStudienDauer();
						x++;
					}
				temp_iterator.next();
			}
			if (x != 0)
				return (double)sum / (double)x;
		}
		return 0;
	}
	
	//Prozentsatz der Studienabbrecher fuer Frauen, Maenner, sowie Frauen und Maenner gemeinsam
	//OUT: Int (%)
	public double studienabbrecher(int type) //0 fuer Frauen, 1 fuer Maenner, 2 fuer Beide
	{
		
		iterator temp_iterator = iterator();
		
		int sum = 0; //Anzahl der Personen gesamt
		int x = 0; //Anzahl der Personen mit Abschluss
		
		if (type == 0) //Frauen 
		{
			while(temp_iterator.hasNext())
			{
				if(temp_iterator.pointer.getvalue().getGeschlecht().equals("w")) //Alle Frauen suchen
				{
					sum++;
					
					//Frauen -> Studienabbrecher raussuchen//
					if(temp_iterator.pointer.getvalue() instanceof Student)
						if(((Student)temp_iterator.pointer.getvalue()).isStudienabbrecher())
						{
							x++;
						}
				}
				temp_iterator.next();
			}
			if( n != 0 && x != 0) {return (100/(double)sum) * (double)x; }
			
		}
			
		if (type == 1) //Maenner
		{
			while(temp_iterator.hasNext())
			{
				if(temp_iterator.pointer.getvalue().getGeschlecht().equals("m")) //Alle Maenner suchen
				{
					sum++;
					if(temp_iterator.pointer.getvalue() instanceof Student)
						//Maenner -> Studienabbrecher suchen//
						if(((Student)temp_iterator.pointer.getvalue()).isStudienabbrecher())
						{
							x++;
						}
				}
				temp_iterator.next();
			}
			
			if( n != 0 && x != 0) {return (100/(double)sum) * (double)x; }
			
		}
		if (type == 2) //Beide
		{
			while(temp_iterator.hasNext()) //Alle personen durchgehen
			{
				//Alle Studienabbrecher//
				if(temp_iterator.pointer.getvalue() instanceof Student)
					if(((Student)temp_iterator.pointer.getvalue()).isStudienabbrecher())
					{
						x++;
					}
			
			temp_iterator.next();
			}
			
			if( n != 0 && x != 0) {return (100/(double)n) * (double)x; }
		}
		//Keine Studienabbrecher//
		return 0;
	}
}